package com.wl.dzt.sys.core.dao.mate;

import com.wl.dzt.sys.util.FieldUtil;
import com.wl.dzt.sys.util.LogicUtil;
import com.wl.dzt.sys.util.StringUtil;

import java.util.HashMap;
import java.util.Map;


/**
 * @author wl_code@163.com
 * @version 1.0
 * @date 2018/7/5/005
 * @description 数据库表
 */
public class DataMateTable {
    /**
     * 数据库表
     */
    private String tableName;

    /**
     * 所属实体
     */
    private Class<?> clazz;

    /**
     * 字段
     */
    private Map<String, DataMateColumn> columns = new HashMap<String, DataMateColumn>();

    /**
     * 实体
     */
    @SuppressWarnings("unused")
    private String entityClass;

    /**
     * <b>根据字段映射获取取了别名后的表</b>
     * <p>
     * 别名规则为 实体对象中的.替换为_
     * </p>
     *
     * @param field 字段名称
     * @return 表的别名
     */
    public String asTableName(String field) {
        return LogicUtil.thenNull(StringUtil.getStringFilterLast(field, "_"), field);
    }

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public Class<?> getClazz() {
        return clazz;
    }

    public void setClazz(Class<?> clazz) {
        this.clazz = clazz;
    }

    public void setColumns(Map<String, DataMateColumn> columns) {
        this.columns = columns;
    }

    public Map<String, DataMateColumn> getColumns() {
        return columns;
    }

    public String getEntityClass() {
        return clazz.getName();
    }

    public void setEntityClass(String entityClass) {
        this.entityClass = entityClass;
    }

    /**
     * <b> 根据表达式获取数据库字段</b>
     * <p>
     * 根据字段名称获取所对应数据列信息
     * </p>
     *
     * @param name 列名
     * @return 数据列
     */
    public DataMateColumn getColumn(String name) {
        FieldUtil.CascadeField cascadeField = FieldUtil.getFieldByCascade(clazz, name);
        Class<?> nowClazz = cascadeField.getClazz();
        if (!name.contains(".")) {
            nowClazz = this.clazz;
        }
        if (cascadeField.getField() != null) {
            return DataMateBase.getTable(nowClazz).getColumns().get(cascadeField.getField().getName());
        }
        return null;
    }
}
